package main

import (
	"context"
	"fmt"
	"net/http"

	"github.com/emicklei/go-restful/v3"
	"github.com/infraboard/mcenter/clients/rpc/middleware"
	"github.com/infraboard/mcenter/clients/rpc/tools"
	"github.com/infraboard/mcube/ioc"
	"github.com/infraboard/mcube/ioc/config/application"
	"github.com/prometheus/client_golang/prometheus/promhttp"

	// 加载所有业务模块
	_ "gitee.com/go-course/go12/devcloud-mini/maudit/apps"
)

func main() {
	req := ioc.NewLoadConfigRequest()
	// 配置文件默认路径: etc/applicaiton.toml
	req.ConfigFile.Enabled = true
	err := ioc.ConfigIocObject(req)
	if err != nil {
		panic(err)
	}

	// 启动之前配置钩子
	// app 在启动的时候 能不能加载一种中间件逻辑, 比如认证中间件
	application.App().HTTP.RouterBuildConfig.BeforeLoad = func(h http.Handler) {
		// 断言 router
		r := h.(*restful.Container)
		// 添加中间件,接入到用户中心
		r.Filter(middleware.RestfulServerInterceptor())

		// 使用gorestful 框架注册一个之定义 handler
		ws := new(restful.WebService)
		ws.Route(ws.GET("/metrics").To(func(r *restful.Request, w *restful.Response) {
			// 基于标准库 包装了一层
			promhttp.Handler().ServeHTTP(w, r.Request)
		}))
		r.Add(ws)


		
	}

	// cmdb如果把怎么的功能列表注册给mcenter
	application.App().HTTP.RouterBuildConfig.AfterLoad = func(h http.Handler) {
		// 断言 router
		r := h.(*restful.Container)
		// 获取到当前加载的所有路由条目, 并且通过rpc注册给 mcenter服务
		err := tools.NewEndpointRegister().Registry(context.Background(), r, "0.0.1")
		if err != nil {
			fmt.Println(err)
		} else {
			fmt.Println("注册成功")
		}
	}

	// 启动补充grpc 认证中间件, grpc启动的时候加载认证中间件
	// application.App().GRPC.AddInterceptors(middleware.GrpcAuthUnaryServerInterceptor())

	// 启动应用, 应用会自动加载 刚才实现的Gin Api Handler
	// 1. 自动加载 gin api handler
	// 2. 自动加载 grpc handler
	err = application.App().Start(context.Background())

	if err != nil {
		panic(err)
	}
}
